﻿// Inner Fire 游戏引擎库
// Component - 游戏组件
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层(4)
// 用于GameObject的组件。所有的组件都继承此基类。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-04-24

#pragma once

#include <static_string.h>
#include <memory>

namespace ifire::game {
struct Transform;
class GameObject;

class Component {
public:
  Component(ikit::sstr component_type, GameObject* game_object);
  Component(const Component& lhs) = delete;
  Component& operator=(const Component& lhs) = delete;
  // 这里设置为虚析构函数，保证继承者能够正确释放
  virtual ~Component();

  // 判断是否是此类型
  bool IsType(ikit::sstr type) const;
  
  // 获得对象的Transform
  Transform& GetTransform();
  
  // 进行一帧的FixedUpdate更新
  virtual void FixedUpdate(float delta_time) = 0;
  // 进行一帧的LateUpadte更新
  virtual void LateUpdate(float delta_time) = 0;
  // 获得Lua中的Meta名称
  virtual const char* GetMetaName() = 0;

protected:
  // 此Component的类型
  ikit::sstr component_type_;
  // 此Component所属的游戏对象
  GameObject* game_object_;

};

using ComponentPtr = std::unique_ptr<Component>;

} // namespace ifire::game